package com.sromku.bugsnag.preferences;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.jface.preference.IPreferenceStore;
import com.sromku.bugsnag.Activator;
import com.sromku.bugsnag.model.Account;
import com.sromku.bugsnag.model.Column;
import com.sromku.bugsnag.model.ColumnInfo;
import com.sromku.bugsnag.model.Project;
import com.sromku.bugsnag.utils.SerializationUtils;
public class PreferencesManager {
private static IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore();
private static List<OnChangeListener> observers = new ArrayList<OnChangeListener>();
public final static String BUGSNAG_ACCOUNTS = "BUGSNAG_ACCOUNTS";
public final static String SELECTED_PROJECT = "SELECTED_PROJECT";
public final static String DEFAULT_COLUMNS = "DEFAULT_COLUMNS";
public final static String SELECTED_COLUMNS = "SELECTED_COLUMNS";
public static void addOnChangeListener(OnChangeListener onChangeListener) {
observers.add(onChangeListener);
}
public static void removeOnChangeListener(OnChangeListener onChangeListener) {
observers.remove(onChangeListener);
}
/**
* Add new account
*/
public static void updateAccount(Account account) {
ArrayList<Account> accounts = getAccounts();
if (!accounts.contains(account)) {
accounts.add(account);
} else {
Collections.replaceAll(accounts, account, account);
}
String serializedAccounts = SerializationUtils.serialize(accounts);
preferenceStore.putValue(BUGSNAG_ACCOUNTS, serializedAccounts);
}
/**
* Set or update the columns user want to see.
*/
public static void updateSelectedColumns(ArrayList<ColumnInfo> columns) {
String serialized = SerializationUtils.serialize(columns);
preferenceStore.putValue(SELECTED_COLUMNS, serialized);
notifyObservers();
}
/**
* Update one column
*/
public static void updateSelectedColumn(ColumnInfo updatedColumnInfo) {
ArrayList<ColumnInfo> selectedColumns = getSelectedColumns();
for (ColumnInfo columnInfo : selectedColumns) {
if (columnInfo.name.equals(updatedColumnInfo.name)) {
columnInfo.selected = updatedColumnInfo.selected;
columnInfo.width = updatedColumnInfo.width;
}
}
PreferencesManager.updateSelectedColumns(selectedColumns);
}
/**
* Delete account
*/
public static void deleteAccount(Account account) {
ArrayList<Account> accounts = getAccounts();
accounts.remove(account);
String serializedAccounts = SerializationUtils.serialize(accounts);
preferenceStore.putValue(BUGSNAG_ACCOUNTS, serializedAccounts);
}
/**
* Get all accounts
*/
@SuppressWarnings("unchecked")
public static ArrayList<Account> getAccounts() {
String serializedAccounts = preferenceStore.getString(BUGSNAG_ACCOUNTS);
ArrayList<Account> accounts = (ArrayList<Account>) SerializationUtils.deserialize(serializedAccounts, ArrayList.class);
if (accounts == null) {
accounts = new ArrayList<Account>();
}
return accounts;
}
/**
* Set default project
*/
public static void setDefaultProject(Project project) {
String serializedProject = SerializationUtils.serialize(project);
preferenceStore.setDefault(SELECTED_PROJECT, serializedProject);
}
/**
* Set the default columns
*/
public static void setDefaultColumns(IPreferenceStore preferenceStore) {
String defaultString = preferenceStore.getDefaultString(DEFAULT_COLUMNS);
if (defaultString == null || defaultString.length() == 0) {
ArrayList<ColumnInfo> defaultColumns = new ArrayList<ColumnInfo>();
defaultColumns.add(ColumnInfo.create(Column.EXCEPTION.getName(), 300, true));
defaultColumns.add(ColumnInfo.create(Column.CLASS.getName(), 150, true));
defaultColumns.add(ColumnInfo.create(Column.LOCATION.getName(), 70, true));
defaultColumns.add(ColumnInfo.create(Column.OCCURRENCES.getName(), 80, true));
defaultColumns.add(ColumnInfo.create(Column.APP_VERSION.getName(), 150, true));
defaultColumns.add(ColumnInfo.create(Column.LAST_DATE.getName(), 150, true));
defaultColumns.add(ColumnInfo.create(Column.MESSAGE.getName(), 200, false));
defaultColumns.add(ColumnInfo.create(Column.AFFECTED_USERS.getName(), 80, false));
defaultColumns.add(ColumnInfo.create(Column.COMMENTS.getName(), 70, false));
defaultColumns.add(ColumnInfo.create(Column.CREATED_DATE.getName(), 150, false));
defaultColumns.add(ColumnInfo.create(Column.IS_RESOLVED.getName(), 70, false));
defaultColumns.add(ColumnInfo.create(Column.RELEASE_STAGES.getName(), 150, false));
defaultColumns.add(ColumnInfo.create(Column.SEVERITY.getName(), 80, false));
String serialized = SerializationUtils.serialize(defaultColumns);
preferenceStore.setDefault(DEFAULT_COLUMNS, serialized);
}
}
/**
* Get default project
*/
public static Project getDefaultProject() {
String serializedDefaultProject = preferenceStore.getDefaultString(SELECTED_PROJECT);
if (serializedDefaultProject == null || serializedDefaultProject.length() == 0) {
return null;
}
return SerializationUtils.deserialize(serializedDefaultProject, Project.class);
}
@SuppressWarnings("unchecked")
public static ArrayList<ColumnInfo> getSelectedColumns() {
String selectedColumns = preferenceStore.getString(SELECTED_COLUMNS);
if (selectedColumns != null && selectedColumns.length() > 0) {
return SerializationUtils.deserialize(selectedColumns, ArrayList.class);
} else {
String defaultColumns = preferenceStore.getDefaultString(DEFAULT_COLUMNS);
return SerializationUtils.deserialize(defaultColumns, ArrayList.class);
}
}
private static void notifyObservers() {
for (OnChangeListener onChangeListener : observers) {
onChangeListener.onChanged();
}
}
public interface OnChangeListener {
void onChanged();
}
}